package org.realityforge.jeo.geolatte.jpa; import java.sql.Blob; import java.sql.SQLException; import javax.persistence.AttributeConverter; import javax.persistence.Converter; import org.geolatte.geom.Geometry; import org.geolatte.geom.codec.db.sqlserver.Decoders; import org.geolatte.geom.codec.db.sqlserver.Encoders; @Converter public class SqlServerConverter<T extends Geometry> implements AttributeConverter<T, Object> { @Override public Object convertToDatabaseColumn( final T attribute ) { if ( null == attribute ) { return null; } else { return Encoders.encode( attribute ); } } @SuppressWarnings( "unchecked" ) @Override public T convertToEntityAttribute( final Object dbData ) { if ( null == dbData ) { return null; } else { Throwable cause = null; if ( dbData instanceof Blob ) { try { final Blob blob = (Blob) dbData; return (T) Decoders.decode( blob.getBytes( 1, (int) blob.length() ) ); } catch ( final SQLException sqle ) { cause = sqle; } } else if ( dbData instanceof byte[] ) { return (T) Decoders.decode( (byte[]) dbData ); } throw new IllegalStateException( "Unable to convert data value:" + dbData, cause ); } } }